package com.linghu.tankgame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

/**
 * @author 令狐荣豪
 * @version 1.0
 * 坦克大战的绘图区域
 */
public class MyPanel extends JPanel implements KeyListener,Runnable{
    //定义我的坦克
    Hero hero=null;
    //定义敌人的坦克
    static Vector<EnemyTank> enemyTanks=new Vector<>();
    //定义一个vector用于存放炸弹
    static Vector<Bomb> bombs=new Vector<>();

    int enemyTankSize=3;

    //定义三张爆炸图片，用于显示爆炸效果
    Image image1=null;
    Image image2=null;
    Image image3=null;

    public MyPanel(){
        hero=new Hero(500,100);
        //初始化敌人的坦克
        for (int i=0;i<enemyTankSize;i++){
            EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);
            enemyTank.setDirect(2);//敌人炮筒向下
            enemyTank.setSpeed(3);//设置敌人坦克速度
            //启动敌人坦克线程，让它动起来
            new Thread(enemyTank).start();
            //给enemyTank加入一颗子弹
            Shot shot=new Shot(enemyTank.getX()+20,enemyTank.getY()+60,enemyTank.getDirect());
            //加入enemyTank的Vector成员
            enemyTank.shots.add(shot);
            //启动shot对象
            new Thread(shot).start();
            enemyTanks.add(enemyTank);

        }
        //初始化图片对象
        image1=Toolkit.getDefaultToolkit().getImage(Package.class.getResource("/bomb_1.gif"));
        image1=Toolkit.getDefaultToolkit().getImage(Package.class.getResource("/bomb_2.gif"));
        image1=Toolkit.getDefaultToolkit().getImage(Package.class.getResource("/bomb_3.gif"));

        hero.setSpeed(2);

    }

    //编写方法，显示我方击毁地方坦克的信息
    public void showInfo(Graphics g){
        //画出玩家的总成绩
        g.setColor(Color.BLACK);
        Font font=new Font("宋体",Font.BOLD,25);
        g.setFont(font);
        g.drawString("您累计击毁敌方坦克",1020,30);
        drawTank(1020,60,g,0,0);//画出敌方坦克
        g.setColor(Color.BLACK);//画笔的颜色，需要重新设置成黑色
        g.drawString(Recoder.getAllEnemyTankNum()+"",1080,100);
    }

    //g就是一个画笔
    public void paint(Graphics g){
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形，默认黑色
        showInfo(g);
        //画出坦克封装方法
        //黄色坦克
//        drawTank(hero.getX(),hero.getY(),g,0,1);

        //青色坦克
        //drawTank(hero.getX(),hero.getY(),g,3,0);


        //画出hero射击的子弹
//        if (hero.shot!=null && hero.shot.isLive){
////            System.out.println("子弹被重绘");
//            g.setColor(Color.white);
//            g.draw3DRect(hero.shot.x,hero.shot.y,5,5,false);
//
//        }
        //将hero的子弹集合shots，遍历取出绘制
        for (int i=0;i<hero.shots.size();i++){
            Shot shot=hero.shots.get(i);
            if (shot!=null && shot.isLive == true){
                g.setColor(Color.white);//子弹颜色设置
                g.draw3DRect(shot.x , shot.y, 5,5,false);
            }else {//如果shot对象已经无效，就从集合中shots拿掉
                hero.shots.remove(shot);
            }
        }

        //如果bombs集合中有对象，就画出
        for (int i=0;i<bombs.size();i++){
            //取出炸弹
            Bomb bomb=bombs.get(i);
            //根据当前这个bomb对象的life值去画出对应的图片
            if (bomb.life>6){
                g.drawImage(image1,bomb.x, bomb.y, 60,60,this);
            }else if (bomb.life>3){
                g.drawImage(image2,bomb.x, bomb.y, 60,60,this);
            }else {
                g.drawImage(image3,bomb.x, bomb.y, 60,60,this);
            }
            //让炸弹的生命值减少
            bomb.lifeDown();
            //如果bomb life为0，就从bombs的集合中删除
            if (bomb.life == 0){
                bombs.remove(bomb);
            }
        }

        if (hero!=null && hero.isLive){
            //画出自己的坦克
            drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);
        }

        //画出敌人的坦克，遍历vector
        for (int i=0;i<enemyTanks.size();i++){
            //取出坦克
            EnemyTank enemyTank = enemyTanks.get(i);
            //判断当前坦克是否还存活
            if (enemyTank.isLive) {//当敌人坦克是存活的，才画出该坦克
                drawTank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 0);

                //画出enemyTank所有子弹
                for (int j = 0; j < enemyTank.shots.size(); j++) {
                    //取出子弹
                    Shot shot = enemyTank.shots.get(j);
                    //控制
                    if (shot.isLive) {
                        g.draw3DRect(shot.x, shot.y, 5, 5, false);
                    } else {
                        //从vector中删除
                        enemyTank.shots.remove(shot);
                    }
                }
            }
        }


    }

    /**
     * @param x 坦克的左上角 x 坐标
     * @param y 坦克的左上角 y 坐标
     * @param g 画笔
     * @param direct 坦克方向（上下左右）
     * @param type 坦克类型--敌人的坦克还是自己的坦克
     */
    //画坦克方法
    public void drawTank(int x,int y,Graphics g,int direct,int type){
        //根据不同类型的坦克设置不同的颜色
        switch (type){
            case 0://我的坦克
                g.setColor(Color.CYAN);
                break;
            case 1://敌人的坦克
                g.setColor(Color.YELLOW);
                break;
        }

        //根据不同的方向绘制坦对应形状的坦克
        switch (direct){
            case 0://0表示向上
                //画出坦克左边的轮子
                g.fill3DRect(x,y,10,60,false);
                //画出坦克右边的轮子
                g.fill3DRect(x+30,y,10,60,false);
                //画出坦克中间的位置
                g.fill3DRect(x+10,y+10,20,40,false);
                //画出坦克中间圆,圆盖
                g.fillOval(x+10,y+20,20,20);
                //画出炮筒
                g.drawLine(x+20,y+30,x+20,y);
                break;
            case 1://1表示向右
                //画出坦克上边的轮子
                g.fill3DRect(x,y,60,10,false);
                //画出坦克下边的轮子
                g.fill3DRect(x,y+30,60,10,false);
                //画出坦克中间的位置
                g.fill3DRect(x+10,y+10,40,20,false);
                //画出坦克中间圆,圆盖
                g.fillOval(x+20,y+10,20,20);
                //画出炮筒
                g.drawLine(x+30,y+20,x+60,y+20);
                break;
            case 2://0表示向下
                //画出坦克左边的轮子
                g.fill3DRect(x,y,10,60,false);
                //画出坦克右边的轮子
                g.fill3DRect(x+30,y,10,60,false);
                //画出坦克中间的位置
                g.fill3DRect(x+10,y+10,20,40,false);
                //画出坦克中间圆,圆盖
                g.fillOval(x+10,y+20,20,20);
                //画出炮筒
                g.drawLine(x+20,y+30,x+20,y+60);
                break;
            case 3://3表示向左
                //画出坦克上边的轮子
                g.fill3DRect(x,y,60,10,false);
                //画出坦克下边的轮子
                g.fill3DRect(x,y+30,60,10,false);
                //画出坦克中间的位置
                g.fill3DRect(x+10,y+10,40,20,false);
                //画出坦克中间圆,圆盖
                g.fillOval(x+20,y+10,20,20);
                //画出炮筒
                g.drawLine(x+30,y+20,x,y+20);
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }
    //编写方法判断敌人的坦克是否击中我们的坦克
    public void hitHero(){
        //遍历所有敌人坦克
        for (int i=0;i<enemyTanks.size();i++){
            //取出敌人坦克
            EnemyTank enemyTank = enemyTanks.get(i);
            //遍历enemyTank对象所有子弹
            for (int j=0;j<enemyTank.shots.size();j++){
                //取出子弹
                Shot shot = enemyTank.shots.get(j);
                //判断shot是否集中我们的坦克
                if (hero.isLive && shot.isLive){
                    hitTank(shot,hero);
                }
            }
        }
    }
    //编写方法判断我们的子弹是否击中敌人的坦克
    public void hitEnemyTank(){
        if(hero.shot!=null&&hero.shot.isLive){//我的子弹还存活
            //遍历敌人所有坦克
            for (int i= 0;i<enemyTanks.size();i++){
                EnemyTank enemyTank = enemyTanks.get(i);
                hitTank(hero.shot,enemyTank);
            }
        }
    }

    //编写方法判断我方子弹是否击中敌人坦克
    public static void hitTank(Shot s,Tank enemyTank){
        //判断s击中
        switch (enemyTank.getDirect()){
            case 0://坦克向上
            case 2://坦克向下
                if (s.x> enemyTank.getX()&& s.x<enemyTank.getX()+40
                &&s.y> enemyTank.getY()&&s.y< enemyTank.getY()+60){
                    s.isLive=false;
                    enemyTank.isLive=false;
                    //当我的子弹击中敌人坦克后，将enemyTank从vector拿掉
                    enemyTanks.remove(enemyTank);
                    //当我方击毁地方一个坦克时，就对数据allEnemyTankNum++
                    if (enemyTank instanceof EnemyTank){
                        Recoder.addallEnemyTankNum();
                    }
                    //创建Bomb对象，加入到bombs集合
                    Bomb bomb=new Bomb(enemyTank.getX(), enemyTank.getY());
                    bombs.add(bomb);
                }
                break;
            case 1://坦克向右
            case 3://坦克向左
                if (s.x> enemyTank.getX()&& s.x<enemyTank.getX()+60
                        &&s.y> enemyTank.getY()&&s.y< enemyTank.getY()+40){
                    s.isLive=false;
                    enemyTank.isLive=false;
                    //创建Bomb对象，加入到bombs集合
                    Bomb bomb=new Bomb(enemyTank.getX(), enemyTank.getY());
                    bombs.add(bomb);
                }
                break;
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //处理按下wasd按键下的处理情况
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_W){//按下w键
            //改变坦克的方向
            hero.setDirect(0);//
            if (hero.getY()>0){
                hero.moveUp();
            }
        } else if (e.getKeyCode()==KeyEvent.VK_D) {
            hero.setDirect(1);
            if (hero.getX()+60<1000){
                hero.moveRight();
            }
        }else if (e.getKeyCode()==KeyEvent.VK_S) {
            hero.setDirect(2);
            if (hero.getY()+60<750){
                hero.moveDown();
            }
        }else if (e.getKeyCode()==KeyEvent.VK_A) {
            hero.setDirect(3);
            if (hero.getX()>0){
                hero.moveLeft();
            }
        }
        //如果用户按下的是J。就需要发射
        if (e.getKeyCode()==KeyEvent.VK_J){
            //判断hero的子弹是否销毁,发射一颗子弹的情况
//            if(hero.shot==null || !hero.shot.isLive){
//                hero.shotEnemyTank();
//            }

            //发射多颗子弹的情况
            hero.shotEnemyTank();
        }

        //让面板重绘
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void run() {//每隔100ms自己重绘区域
        while (true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //判断我们的子弹是否击中敌人坦克
           hitEnemyTank();

            //判断敌人是否击中我们
            hitHero();


            this.repaint();
        }
    }
}
